/*
 * @(#)DefaultReturnValue.java $version 2010. 8. 11
 *
 * Copyright 2007-2010 NHN Corp. All rights Reserved. 
 * NHN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package com.nhncorp.usf.core.call;

import java.util.Arrays;
import java.util.List;

/**
 * 일반적인 리턴 값이 있는 {@link Call}에 대한 {@link ReturnValue} 구현체.
 * 
 * @author Web Platform Development Team
 */
public class DefaultReturnValue implements ReturnValue {
	private static final long serialVersionUID = -7018265655983660457L;
	private final Object value;

	/**
	 * 주어진 타입 및 리턴 값을 갖는 인스턴스를 생성한다.
	 * 
	 * @param value DefaultReturnValue에 저장할 값
	 */
	public DefaultReturnValue(Object value) {
		if (value == null) {
			throw new NullPointerException("value");
		}
		this.value = value;
	}

	/**
	 * 주어진 값들을 담고 있는 {@link List}를 리턴 값으로 갖는 인스턴스를 생성한다.
	 * 
	 * @param values DefaultReturnValue에 저장할 값 type인 VARGS(가변인자형)
	 */
	public DefaultReturnValue(Object... values) {
		if (values == null) {
			throw new NullPointerException("value");
		}
		this.value = Arrays.asList(values);
	}

	/**
	 * {@inheritDoc}
	 */
	public Object get() {
		return value;
	}

	/**
	 * {@inheritDoc}
	 */
	public Class< ? > getType() {
		return value.getClass();
	}

	/**
	 * {@inheritDoc}
	 */
	public String toString() {
		return "return: " + get() + " (" + getType().getSimpleName() + ')';
	}

	/**
	 * {@inheritDoc}
	 */
	public boolean equals(Object object) {
		if (this == object) {
			return true;
		}
		if (!(object instanceof DefaultReturnValue)) {
			return false;
		}

		DefaultReturnValue that = (DefaultReturnValue) object;

		if (value != null ? !value.equals(that.value) : that.value != null) {
			return false;
		}

		return true;
	}

	/**
	 * {@inheritDoc}
	 */
	public int hashCode() {
		return value != null ? value.hashCode() : 0;
	}
}

